/*******************************************************************************
* 
*    Copyright(C) 2018 BX All rights reserved.
* 
* File        : main.c
* Author      : BX
* Version     : V1.00
* Date        : 2018-1-1
* Description : MAIN
* Chip        : HC32L136
* History     : V1.00, 2018-1-1, bx, first version

* Disclaimer  :
*   本程序所有权归作者所有。
*   本程序仅用于演示或实现特定产品的功能，任何修改或其它目的的应用均不作保证，
*   未经作者同意不得将本程序的全部或部分用于商业目的。
*******************************************************************************/
#include "ddl.h"
#include "driver.h"
#include "adr.h"
#include "lcd.h"
#include "gpio.h"

extern	void LCD_Diplay(uint32_t lcd_ram0,uint32_t lcd_ram1,uint32_t lcd_ram2,uint32_t lcd_ram3);
extern	void LCD_DISPLAY(uint8_t num);
extern	void init_sys(void);
extern	void eeprom_init(void);
extern	void init_att7022(void);
extern	void Set_parameter_checking(void);
extern	void led_status(void);
extern	void Eeprom_To_SetBuff(void);				
extern	void led_dis(void);
extern	void Data_Collection(void);
extern 	void Data_management(void);
extern 	void LCD_disp_management(void);
extern	void Set_windows(void);
extern 	void Total_alarm_processing(void);
extern 	void Line_fault_processing(void);
extern 	void key_funtion(void);
extern 	void SetBuff_To_Eeprom(void);
extern 	void check_wr_eeprom(void);
extern 	void Operating_check(void);
extern 	void BakLamp_management(void);
extern 	void Selfcheck(void);
extern 	void UART1_Rest(void);
extern 	void Led_management(void);
extern 	void FlashInt(void);
extern 	void flash_Init(void);
extern 	void calibrate(void);

/*******************************************************************************
 * 初始化
 ******************************************************************************/
void hard_init(void)
{
//	stc_sysctrl_clk_cfg_t stcCfg;
	
	Sysctrl_ClkSourceEnable(SysctrlClkRCL,TRUE);		////打开内部低速时钟
	Sysctrl_SetRCLTrim(SysctrlRclFreq32768);				////时钟校准

	///<========================== ??????? ===================================
	
//	Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);
//	stcCfg.enClkSrc		= SysctrlClkRCH;   		//< HCLK SYSCLK/1
//	stcCfg.enHClkDiv	= SysctrlHclkDiv4;		//SysctrlHclkDiv1;分频 1MHz
//	stcCfg.enPClkDiv	= SysctrlPclkDiv1;
//	Sysctrl_ClkInit(&stcCfg);

	// 时钟默认为RCH4M
	//Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);  //
	//SystemCoreClockUpdate();   
	
	//Sysctrl_SetHCLKDiv(SysctrlHclkDiv4);  // HCLK=SysCLK/2
	//Sysctrl_SetPCLKDiv(SysctrlPclkDiv2);  // PCLK=HCLK/2
	
	Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);
  SystemCoreClockUpdate();   


// 中断默认为使能
	di();
	clock_init();
	port_init();
//	rtc_init(); 
	lpt_init();
	lcd_init();
//	ei();
	lcd_clear();
}

////////////////////////////////////////////////////////////////////////////////
//typedef struct
//{
//    uint8_t data[100]; // 全双工收发缓冲区分开
//    
//    uint8_t tx_cnt;
//    uint8_t tx_len;
//    uint8_t tx_done;
//    // uart8_t tx_timer; // 100ms, 发送可以不使用超时
//    
//    uint8_t rx_cnt;
//    uint8_t rx_len;
//    uint8_t rx_done;
//    uint8_t rx_timer;   // 100ms
//    
//    uint8_t error;
//}UART;
//UART lpuart;




/////<LPUART0 中断服务函数
//void LpUart0_IRQHandler(void)
//{
//    if(LPUart_GetStatus(M0P_LPUART0, LPUartTC))
//		{
//        LPUart_ClrStatus(M0P_LPUART0, LPUartTC);   ///<清发送中断请求
//       
//        if(lpuart.tx_cnt < lpuart.tx_len)
//        {
//            LPUart_SendDataIt(M0P_LPUART0, 
//                  lpuart.data[lpuart.tx_cnt++]); ///把接收数据取反，并发送       
//            // lp_uart.tx_timer = 10; // 100ms, 发送可以不使用超时
//        }
//        else
//        {
//            lpuart.tx_done = 1;
//            LPUart_DisableIrq(M0P_LPUART0,LPUartTxIrq);///<禁止发送中断
//        }
//    }
//    
//    if(LPUart_GetStatus(M0P_LPUART0, LPUartRC))    ///接收数据
//    {
//        LPUart_ClrStatus(M0P_LPUART0, LPUartRC);   ///<清接收中断请求

//        if(lpuart.rx_cnt < lpuart.rx_len)
//        {
//            lpuart.data[lpuart.rx_cnt++] = LPUart_ReceiveData(M0P_LPUART0);///读取数据;
//            lpuart.rx_timer = 10; // 100ms
//        }
//        
//        if(lpuart.rx_cnt == lpuart.rx_len)
//        {
//            lpuart.rx_timer = 0;
//            lpuart.rx_done = 1;
//            LPUart_DisableIrq(M0P_LPUART0, LPUartRxIrq);///<禁止接收中断
//        }
//    }
//}

///< 端口配置
void App_LpUartPortCfg(void)
{
    stc_gpio_cfg_t stcGpioCfg;
    
    DDL_ZERO_STRUCT(stcGpioCfg);
    
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
    
    ///<TX
    stcGpioCfg.enDir =  GpioDirOut;
    Gpio_Init(GpioPortC, GpioPin4, &stcGpioCfg);//TX2
    Gpio_SetAfMode(GpioPortC, GpioPin4, GpioAf1);
      
    //<RX
    stcGpioCfg.enDir =  GpioDirIn;
    Gpio_Init(GpioPortC, GpioPin5, &stcGpioCfg);//RX2
    Gpio_SetAfMode(GpioPortC, GpioPin5, GpioAf1);    
}

///< LPUART配置
void App_LpUartCfg(void)
{
    stc_lpuart_cfg_t  stcCfg;

    DDL_ZERO_STRUCT(stcCfg);
    
    ///<外设模块时钟使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart0, TRUE);    
    
    ///<LPUART 初始化
    stcCfg.enStopBit = LPUart1bit;                   ///<1停止位    
  //  stcCfg.enMmdorCk = LPUartEven;                   ///<偶校验
    stcCfg.stcBaud.enSclkSel = LPUartMskPclk;        ///<传输时钟源
    stcCfg.stcBaud.u32Sclk = Sysctrl_GetPClkFreq();  ///<PCLK获取
    stcCfg.stcBaud.enSclkDiv = LPUartMsk4Or8Div;     ///<采样分频
    stcCfg.stcBaud.u32Baud = 2400;                   ///<波特率
    stcCfg.enRunMode = LPUartMskMode1;               ///<工作模式
    LPUart_Init(M0P_LPUART0, &stcCfg);
     
    ///<LPUART 中断使能
    LPUart_ClrStatus(M0P_LPUART0,LPUartRC);          ///<清接收中断请求
    LPUart_ClrStatus(M0P_LPUART0,LPUartTC);          ///<清发送中断请求
//    LPUart_DisableIrq(M0P_LPUART0,LPUartRxIrq);      ///<禁止接收中断
//    LPUart_EnableIrq(M0P_LPUART0,LPUartTxIrq);       ///<使能发送中断
		LPUart_DisableIrq(M0P_LPUART0, LPUartTxIrq); 		///<禁止发送中断
		LPUart_EnableIrq(M0P_LPUART0, LPUartRxIrq);			///<使能接收中断

		EnableNvic(LPUART0_IRQn,IrqLevel3,TRUE);         ///<系统中断使能
}


void lpuart_init(void)
{ 
    App_LpUartPortCfg();
    App_LpUartCfg();
}

//void lpuart_send_data(uint8_t len)
//{
//    LPUart_ClrStatus(M0P_LPUART0, LPUartTC);  
//    LPUart_DisableIrq(M0P_LPUART0, LPUartTxIrq); 
//        
//    lpuart.tx_len = len;
//    lpuart.tx_cnt = 0;
//    lpuart.tx_done = 0;
//    // lpuart.tx_timer = 10; // 100ms, 发送可以不使用超时
//    
//    LPUart_EnableIrq(M0P_LPUART0, LPUartTxIrq);
//    LPUart_SendDataIt(M0P_LPUART0, 
//        lpuart.data[lpuart.tx_cnt++]); ///把接收数据取反，并发送       
//}
//
//void lpuart_receive_data(uint8_t len)
//{
//    LPUart_ClrStatus(M0P_LPUART0, LPUartRC);   
//    LPUart_DisableIrq(M0P_LPUART0, LPUartRxIrq); 
//        
//    lpuart.rx_len = len;
//    lpuart.rx_cnt = 0;
//    lpuart.rx_done = 0;
//    lpuart.rx_timer = 0;
//    
//    LPUart_EnableIrq(M0P_LPUART0, LPUartRxIrq);
//}

//void lpuart_timer(void)
//{
//    if(lpuart.rx_timer > 0)
//    {
//        if(0 == --lpuart.rx_timer)
//        {
//            lpuart.rx_done = 1;
//            LPUart_ClrStatus(M0P_LPUART0, LPUartRC);   
//            LPUart_DisableIrq(M0P_LPUART0, LPUartRxIrq); 
//        }
//    }
//}
//
//void lpuart_send_str(char *str)
//{
//    uint8_t len = strlen(str);
//    memcpy(lpuart.data, str, len);
//    
//    lpuart_send_data(len);
//    while(!lpuart.tx_done);
//    lpuart.tx_done = 0;
//}
////////////////////////////////////////////////////////////////////////////////
// 10ms tick timer
//void SysTick_IRQHandler(void)
//{
//    lpuart_timer();
//}

// 滴答定时器使能函数，滴答定时器初始化10mS
void sys_tick_init(void)
{
    SysTick_Config(40000); // 10ms@4M
}
////////////////////////////////////////////////////////////////////////////////

int32_t main(void)
{
//	wdt_reset();									// 喂狗
	hard_init();									// 硬件初始化
  sys_tick_init();							// 时钟初始化
  lpuart_init();								// 串口初始化
  FlashInt();										// Flash初始化
	init_sys();										// 系统变量初始化
	init_att7022();								// 电能芯片初始化
	ei();

	Set_parameter_checking();			// 设置参数检查
	calibrate(); 									// 系数校准 
	
	while(1)
	{
		// WDT_CONTR = Dog_Set;
		Led_management();
		Data_management();	 				// 数据滤波处理
		LCD_disp_management();			// LCD显示管理
		Total_alarm_processing();		// 全部信息管理
		Line_fault_processing();		// 互感器信息管理
		key_funtion();							// 键盘管理
    check_wr_eeprom();    			// 检查是否写EEPROM
		Operating_check();					// 操作检查
		BakLamp_management();				// 背光管理
		UART1_Rest();								// 通讯复位管理
		Selfcheck();								// 自检管理
	}	
}
